/* eslint-disable */
import * as docx from "docx";
import es from "element-ui/src/locale/lang/es";
require('script-loader!file-saver');
require('script-loader!./Blob');
if(process.env.NODE_ENV !== 'production') {
  require('script-loader!xlsx/dist/xlsx.core.min')
}
function generateArray(table) {
    var out = [];
    var rows = table.querySelectorAll('tr');
    var ranges = [];
    for (var R = 0; R < rows.length; ++R) {
        var outRow = [];
        var row = rows[R];
        var columns = row.querySelectorAll('td');
        for (var C = 0; C < columns.length; ++C) {
            var cell = columns[C];
            var colspan = cell.getAttribute('colspan');
            var rowspan = cell.getAttribute('rowspan');
            var cellValue = cell.innerText;
            if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;

            //Skip ranges
            ranges.forEach(function (range) {
                if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
                    for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
                }
            });

            //Handle Row Span
            if (rowspan || colspan) {
                rowspan = rowspan || 1;
                colspan = colspan || 1;
                ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}});
            }
            ;

            //Handle Value
            outRow.push(cellValue !== "" ? cellValue : null);

            //Handle Colspan
            if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
        }
        out.push(outRow);
    }
    return [out, ranges];
};

function datenum(v, date1904) {
    if (date1904) v += 1462;
    var epoch = Date.parse(v);
    return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}

function sheet_from_array_of_arrays(data, opts) {
    var ws = {};
    var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}};
    for (var R = 0; R != data.length; ++R) {
        for (var C = 0; C != data[R].length; ++C) {
            if (range.s.r > R) range.s.r = R;
            if (range.s.c > C) range.s.c = C;
            if (range.e.r < R) range.e.r = R;
            if (range.e.c < C) range.e.c = C;
            var cell = {v: data[R][C]};
            if (cell.v == null) continue;
            var cell_ref = XLSX.utils.encode_cell({c: C, r: R});

            if (typeof cell.v === 'number') cell.t = 'n';
            else if (typeof cell.v === 'boolean') cell.t = 'b';
            else if (cell.v instanceof Date) {
                cell.t = 'n';
                cell.z = XLSX.SSF._table[14];
                cell.v = datenum(cell.v);
            }
            else cell.t = 's';

            ws[cell_ref] = cell;
        }
    }
    if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
    return ws;
}

function Workbook() {
    if (!(this instanceof Workbook)) return new Workbook();
    this.SheetNames = [];
    this.Sheets = {};
}

function s2ab(s) {
    var buf = new ArrayBuffer(s.length);
    var view = new Uint8Array(buf);
    for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
    return buf;
}

export function export_table_to_excel(id) {
    var theTable = document.getElementById(id);
    console.log('a')
    var oo = generateArray(theTable);
    var ranges = oo[1];

    /* original data */
    var data = oo[0];
    var ws_name = "SheetJS";
    console.log(data);

    var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);

    /* add ranges to worksheet */
    // ws['!cols'] = ['apple', 'banan'];
    ws['!merges'] = ranges;

    /* add worksheet to workbook */
    wb.SheetNames.push(ws_name);
    wb.Sheets[ws_name] = ws;

    var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});

    saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx")
}

function formatJson(jsonData) {
    console.log(jsonData)
}
export function export_json_to_excel(th, jsonData, defaultTitle) {

    /* original data */

    var data = jsonData;
    data.unshift(th);
    var ws_name = "SheetJS";

    var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);


    /* add worksheet to workbook */
    wb.SheetNames.push(ws_name);
    wb.Sheets[ws_name] = ws;

    var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
    var title = defaultTitle || '列表'
    saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx")
}

export function export_json_to_excel_merges(th, jsonData, defaultTitle,listMerges) {
  return new Promise((resolve, reject)=>{
    /* original data */

    var data = jsonData;
    data.unshift(th);
    var ws_name = "SheetJS";

    var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);


    /* add worksheet to workbook */
    wb.SheetNames.push(ws_name);
    let merge = listMerges.map(item=>{
      return   { s: {r:item.h, c:0}, e: {r:item.h, c:10} }
    })
    // s: {//s为开始
    //   c: 1,//开始列
    //     r: 0//可以看成开始行,实际是取值范围
    // },
    // e: {//e结束
    //   c: 4,//结束列
    //     r: 0//结束行
    // }
//var merge = XLSX.utils.decode_range("A1:B1"); // this is equivalent
//   var merge2 = { s: {r:0, c:0}, e: {r:0, c:10} };
    /* generate worksheet */
    // var ws = XLSX.utils.aoa_to_sheet(data);
    /* add merges */
    if(!ws['!merges']) ws['!merges'] = [];
    ws['!merges'].push(...merge);
    ws["!cols"] = [
      { wch: 30 },
      { wch: 30 },
      { wch: 30 },
      { wch: 30 },
      { wch: 30 },
      { wch: 30 },
      { wch: 30 },
      { wch: 30 }
    ];
    wb.Sheets[ws_name] = ws;

    var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary',compression :true});
    var title = defaultTitle || '列表'
    try {
      saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx")
      setTimeout(()=>{
        resolve()
      })
    }catch (e) {
      reject(e)
    }
  })

}
export function export_json_to_word_merges(list,name) {
  return new Promise((resolve, reject) => {
    let userdata = []
    const doc = new docx.Document()

     list.forEach(item=>{
      // 标题的判断
      if(Object.prototype.toString.call(item)==='[object Object]'&&item.center){
        userdata.push(docxTitle(docx,item.value))
      }
      //  二级标题
      if(Object.prototype.toString.call(item)==='[object Object]'&&item.desc){
        userdata.push(docxDesc(docx,item.value))
      }
       //  三级标题
       if(Object.prototype.toString.call(item)==='[object Object]'&&item.desc3){
         userdata.push(docxDesc3(docx,item.value))
       }
      //  图文
      if(Object.prototype.toString.call(item)==='[object Object]'&&item.content){
        docxContent(docx,item).forEach(url=>{
          userdata.push(url)
        })
        if(item.src){
          item.src.forEach(url=>{
            userdata.push(new docx.Paragraph(docx.Media.addImage(doc, url,100,100)))
          })
        }
      }
      // 表格
      if(Object.prototype.toString.call(item)==='[object Array]'&&!item.noTable){
        console.log(11111111,item)
        userdata.push(docxTable(docx,item))
      }
       // 列表
       if(Object.prototype.toString.call(item)==='[object Array]'&&item.noTable){
         console.log(22222222,item)
         docxList(docx,item).forEach(item=>{
           userdata.push(item)
         })
       }
    })
    doc.addSection({
      children: userdata
    })
    docx.Packer.toBlob(doc).then(blob => {
      console.log(blob)
      saveAs(blob, `${name}.docx`)
      console.log('Document created successfully')
      resolve()
    }).catch(error=>{
      reject(error)
    })
  })
}
// 处理标题
function docxTitle(docx,text) {
 return  new docx.Paragraph({
      children: [
        new docx.TextRun({
          text: text,
          font: {
            name: 'Monospace'
          },
          size: 36,
          bold: true
        })
      ],
   // 居中
      alignment: docx.AlignmentType.CENTER
    })
}

function docxList(docx,list){
  return list.map((item,index)=>{
    if(index%2 === 1){
      return docxDescT(docx,item+'')
    }else {
      return  docxDesc3(docx,item)
    }
  })
}
// 处理表格
function docxTable(docx,list) {
  list.shift();// 去掉数组第一项
  return new docx.Table({
      rows: list.map(item=>{
        return  new docx.TableRow({
          children: item.map(value=>{
            if( value==null|| value == ''){
              value = ''
            }
            return new docx.TableCell({
              // value只能是字符串类型
                  children: [new docx.Paragraph(value + '')],
                  width: {
                    size: 1000,
                    type: docx.WidthType,
                  },
                  verticalAlign: docx.VerticalAlign.CENTER,
                })
          })
        })
      }),
      alignment: docx.AlignmentType.CENTER,
      width: {
        size: 100,
        type: docx.WidthType.PERCENTAGE,
      },
    })
}
// 处理二级标题
function docxDesc(docx,text) {
  return  new docx.Paragraph({
    children: [
      new docx.TextRun({
        text: text,
        font: {
          name: 'Monospace'
        },
        size: 32,
        bold: true,
      }),

    ],
    spacing: {
      before: 240,
      after: 120
    },
  })
}
// 处理三级级标题
function docxDesc3(docx,text) {
  return  new docx.Paragraph({
    children: [
      new docx.TextRun({
        text: text+':',
        font: {
          name: 'Monospace'
        },
        size: 22,
        bold: true,
      }),

    ],
    spacing: {
      before: 240,
      after: 120
    },
  })
}
function docxDescT(docx,text) {
  return  new docx.Paragraph({
    children: [
      new docx.TextRun({
        text: text.toLowerCase(),
        allCaps: true
      }),

    ],
    spacing: {
      before: 240,
      after: 120
    },
    indent:{
      start: 500
    }
  })
}
function docxContent(docx,item) {
  console.log(item)
  let arr = []
  let value =  new docx.Paragraph({
    children: [
      new docx.TextRun({
        text: item.value + '',
        font: {
          name: 'Monospace'
        },
        size: 22,
        bold: true,
      }),

    ],
    spacing: {
      before: 240,
      after: 120
    },
  })
  arr.push(value)
  if (item.content){
    let text =  new docx.Paragraph(item.content+'')
    arr.push(text)
    return arr
  }
}
